package response

import (
	"github.com/zeromicro/go-zero/rest/httpx"
	"net/http"
)

// Body 统一响应结构体，用于封装所有API响应的格式
// Code: 业务状态码，0表示成功，非0表示失败
// Msg: 业务消息，用于描述响应结果
// Data: 业务数据，成功时返回具体数据，失败时为nil
type Body struct {
	Code uint32      `json:"code"` // 业务状态码
	Msg  string      `json:"msg"`  // 业务消息
	Data interface{} `json:"data"` // 业务数据
}

// Response 统一HTTP响应处理函数
// 该函数根据业务逻辑的执行结果，返回统一格式的JSON响应
// 参数说明:
// r: HTTP请求对象，用于获取请求上下文信息
// w: HTTP响应写入器，用于向客户端写入响应数据
// resp: 业务逻辑返回的响应数据，成功时不为nil
// err: 业务逻辑返回的错误信息，成功时为nil
func Response(r *http.Request, w http.ResponseWriter, resp interface{}, err error) {
	// 判断业务逻辑是否执行成功
	if err == nil {
		// 成功响应处理
		// 创建成功的响应体，业务状态码为0，消息为"成功"，数据为业务逻辑返回的数据
		successBody := &Body{
			Code: 0,    // 成功状态码
			Msg:  "成功", // 成功消息
			Data: resp, // 业务数据
		}
		// 使用go-zero的httpx工具函数，以200状态码返回JSON格式的成功响应
		httpx.WriteJson(w, http.StatusOK, successBody)
		return
	}

	// 错误响应处理
	// 当业务逻辑执行失败时，返回错误信息
	errCode := uint32(10086) // 默认错误码
	// 可以根据实际错误类型，返回具体的错误信息
	// 在实际项目中，这里通常会根据err的类型或内容来确定具体的错误码和错误消息
	errMsg := "服务器错误" // 默认错误消息

	// 创建错误响应体，业务状态码为错误码，消息为错误描述，数据为nil
	errorBody := &Body{
		Code: errCode, // 错误状态码
		Msg:  errMsg,  // 错误消息
		Data: nil,     // 错误时数据为空
	}

	// 使用go-zero的httpx工具函数，以400状态码返回JSON格式的错误响应
	// 在实际项目中，可能会根据错误类型选择不同的HTTP状态码
	httpx.WriteJson(w, http.StatusBadRequest, errorBody)
}
